package main

import (
	"rt.com/mocktool/admin"
	"rt.com/mocktool/cli"
	"rt.com/mocktool/mock"
	"rt.com/mocktool/proxy"
	"rt.com/mocktool/utils/file"
	"rt.com/mocktool/utils/glog"
	"rt.com/mocktool/utils/net"
	"rt.com/mocktool/values"
)

// main 启动方法
func main() {
	// 初始化命令行参数
	if cli.Init() {
		// 帮助直接退出
		return
	}
	// 初始化日志系统
	glog.Init()
	// 输出启动日志
	glog.Info(values.TextWelcome)

	// 初始化业务核心
	mock.Instance.Init(file.PathInExePath(cli.Config))
	// 栈尾执行业务员核心关闭关闭
	defer mock.Instance.Close()
	// 初始化信号量
	SIGNAL := make(chan int)
	// 初始化信号量返回值为0（初始态）
	// 其他值：1（重启Admin） 2(重启Proxy) 3(全部重启)
	signalRet := 0
Loop:
	// 重启Admin
	if signalRet == 0 || signalRet == 1 || signalRet == 3 {
		go admin.Instance.Start(SIGNAL)
	}
	// 重启Proxy
	if signalRet == 0 || signalRet == 2 || signalRet == 3 {
		go proxy.Instance.Start(SIGNAL)
	}
	// 打印代理服务启动日志
	if signalRet == 0 || signalRet == 3 {
		printAdminAddress()
	}
	// 阻塞等待信号
	signalRet = <-SIGNAL
	// 信号判断处理
	if signalRet == 1 {
		// 后台服务重启
		glog.Info(values.TextAdminRestart)
	} else if signalRet == 2 {
		// 代理服务重启
		glog.Info(values.TextProxyRestart)
	} else {
		// 全部服务重启
		glog.Info(values.TextServerRestart)
	}
	goto Loop
}

// printAdminAddress 打印地址及LOGO
func printAdminAddress() {
	// 打印地址
	localIP := net.GetIP()
	adminPort := mock.Instance.GetConfig().AdminPort
	glog.Info(values.TextAdminStarted, localIP, ":", adminPort)
	// 打印LOGO
	glog.Info(values.LOGO)
}
